<?php
namespace app\service;
use Overtrue\PHPOpenCC\OpenCC;
use Overtrue\Pinyin\Pinyin;



class ApiService
{
    private $_endpoint = 'http://122.114.198.236:28883/lyrics';
    private $_current_lang;
    public function __construct($current_lang)
    {
        $this->_current_lang = $current_lang;
    }

    public function search($keyword)
    {
        // 对关键词进行URL编码，避免中文和特殊字符问题
        $encodedKeyword = urlencode($keyword);
        $url = $this->_endpoint . '?title=' . $encodedKeyword;
        try{
            $response = curl_get($url);
            $response = json_decode($response, true);
        }catch(\Exception $e){
            return [];
        }
        
        if(isset($response['lyrics']) && !empty($response['lyrics'])){
            // 清理响应中的LRC标签
            $response['lyrics'] = $this->cleanLrcTags($response['lyrics']);
        }
        
        if ($this->_current_lang == 'en') {
            $response['title_pinyin'] = Pinyin::fullSentence($response['title'],'none')->join(' '); 
            $response['artist_pinyin'] = Pinyin::fullSentence($response['artist'],'none')->join(' ');
            
            // 按行处理歌词拼音转换，保持换行格式
            $lines = explode("\n", $response['lyrics']);
            $pinyinLines = [];
            foreach($lines as $i => $line) {
                if(trim($line) !== '') {
                    // 对非空行进行拼音转换
                    $pinyinLines[$i]['original'] = $line;
                    $pinyinLines[$i]['pinyin'] = Pinyin::fullSentence(trim($line), 'none')->join(' ');
                } else {
                    // 保持空行
                    $pinyinLines[] = '';
                }
            }
            $response['lyrics'] =  $pinyinLines;
        }
        return $response;
    }
    /**
     * 记录生成历史
     */
    public function recordGeneration($keyword, $result,$process_time)
    {   
        $generation_id = db('generations')->insertGetId([
            'process_time' => $process_time,
            'input_keyword' => $keyword,
            'output' => json_encode($result),
            'user_ip' => request()->ip(),
            'http_accept_language' => substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 200),
            'user_agent' => substr(request()->header('user-agent'), 0, 200),
            'language' => $this->_current_lang,
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);      
        return $generation_id;
    }
    
    /**
     * 清理LRC歌词格式标签
     * @param string $text 包含LRC标签的文本
     * @return string 清理后的纯文本
     */
    public function cleanLrcTags($text)
    {
        if (empty($text)) {
            return $text;
        }
        
        // 去掉所有方括号及其内容，包括：
        // [id:$00000000] - ID标签
        // [ti:] - 标题标签
        // [ar:] - 艺术家标签
        // [al:] - 专辑标签
        // [by:天琴实验室AI生成v1.0] - 制作标签
        // [00:00.000] - 时间戳标签
        $cleanText = preg_replace('/\[[^\]]*\]/', '', $text);
        
        // 去掉多余的空行，保持文本格式整洁
        $cleanText = preg_replace('/\n\s*\n/', "\n", $cleanText);
        
        // 去掉开头和结尾的空白字符
        $cleanText = trim($cleanText);
        
        // 新增：删除以"词："、"曲："、"编曲："开头的行
        $lines = explode("\n", $cleanText);
        $filteredLines = [];
        
        foreach ($lines as $line) {
            $trimmedLine = trim($line);
            
            // 定义需要过滤的音乐制作信息关键词数组
            $keywords = [
                '词：', '曲：', '编曲：', '制作人：', '合声：', '合声编写：', 
                '吉他：', '贝斯：', '鼓：', '录音助理：', '录音工程：', '混音工程：',
                '作词：', '作曲：', '混音/母带：', '和声：', '制作公司：', 
                '策划/推广：', '监制：', '总监制：', '出品：'
            ];
            
            // 检查行是否以任何一个关键词开头
            $shouldFilter = false;
            foreach ($keywords as $keyword) {
                if (mb_strpos($trimmedLine, $keyword) === 0) {
                    $shouldFilter = true;
                    break;
                }
            }
            
            // 如果不需要过滤，则保留这一行
            if (!$shouldFilter) {
                $filteredLines[] = $line;
            }
        }
        
        $cleanText = implode("\n", $filteredLines);
        
        // 再次清理可能产生的多余空行
        $cleanText = preg_replace('/\n\s*\n/', "\n", $cleanText);
        $cleanText = trim($cleanText);
        
        return $cleanText;
    }
}